#pragma once

#include <string>
#include <memory>
#include <unordered_map>
#include <functional>
#include <vector>
#include <cstdint>
#include "order.h"
#include "trade.h"

namespace hft {

class OrderManager {
public:
    // 构造函数
    OrderManager();
    
    // 创建订单
    std::string createOrder(const Order& order);
    
    // 修改订单
    bool modifyOrder(const std::string& order_id, double price, int volume);
    
    // 取消订单
    bool cancelOrder(const std::string& order_id);
    
    // 批量取消订单
    int cancelOrders(const std::vector<std::string>& order_ids);
    
    // 取消所有订单
    int cancelAllOrders();
    
    // 取消特定合约的所有订单
    int cancelSymbolOrders(const std::string& symbol);
    
    // 取消特定账户的所有订单
    int cancelAccountOrders(const std::string& account);
    
    // 取消特定策略的所有订单
    int cancelStrategyOrders(const std::string& strategy_id);
    
    // 处理订单状态更新
    void onOrderStatus(const Order& order);
    
    // 处理成交回报
    void onTrade(const Trade& trade);
    
    // 获取订单
    Order* getOrder(const std::string& order_id);
    
    // 获取账户的所有订单
    std::vector<Order*> getAccountOrders(const std::string& account);
    
    // 获取策略的所有订单
    std::vector<Order*> getStrategyOrders(const std::string& strategy_id);
    
    // 获取合约的所有订单
    std::vector<Order*> getSymbolOrders(const std::string& symbol);
    
    // 获取所有订单
    const std::unordered_map<std::string, Order>& getAllOrders() const;
    
    // 获取所有活跃订单（未成交、部分成交）
    std::vector<Order*> getActiveOrders();
    
    // 清理已完成的订单
    void cleanCompletedOrders();
    
    // 注册订单状态回调
    void registerOrderCallback(std::function<void(const Order&)> callback);
    
    // 注册成交回调
    void registerTradeCallback(std::function<void(const Trade&)> callback);

private:
    // 生成订单ID
    std::string generateOrderId();
    
    // 通知订单状态更新
    void notifyOrderUpdate(const Order& order);
    
    // 通知成交回报
    void notifyTrade(const Trade& trade);

private:
    // 订单映射表，键为订单ID
    std::unordered_map<std::string, Order> orders_;
    
    // 成交映射表，键为成交ID
    std::unordered_map<std::string, Trade> trades_;
    
    // 订单ID计数器
    uint64_t order_id_counter_ = 0;
    
    // 订单状态回调
    std::function<void(const Order&)> order_callback_;
    
    // 成交回调
    std::function<void(const Trade&)> trade_callback_;
};

} // namespace hft